package fi.otavanopisto.muikku.errors;
import java.io.FileNotFoundException;
import java.util.Iterator;
import javax.ejb.EJBException;
import javax.el.ELException;
import javax.enterprise.inject.CreationException;
import javax.faces.FacesException;
import javax.faces.application.NavigationHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
import javax.servlet.http.HttpServletResponse;
import org.ocpsoft.rewrite.exception.RewriteException;
import fi.otavanopisto.security.AuthorizationException;
public class ExceptionHandler extends ExceptionHandlerWrapper {
private final javax.faces.context.ExceptionHandler wrapped;
public ExceptionHandler(final javax.faces.context.ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public javax.faces.context.ExceptionHandler getWrapped() {
return this.wrapped;
}
@Override
public void handle() throws FacesException {
for (final Iterator<ExceptionQueuedEvent> queuedEventIterator = getUnhandledExceptionQueuedEvents().iterator(); queuedEventIterator.hasNext();) {
ExceptionQueuedEvent queuedEvent = queuedEventIterator.next();
ExceptionQueuedEventContext queuedEventContext = queuedEvent.getContext();
Throwable exception = queuedEventContext.getException();
while ((exception instanceof FacesException || exception instanceof EJBException || exception instanceof ELException
|| exception instanceof RewriteException || exception instanceof CreationException || exception instanceof IllegalStateException)
&& exception.getCause() != null) {
exception = exception.getCause();
}
FacesContext facesContext = FacesContext.getCurrentInstance();
ExternalContext externalContext = facesContext.getExternalContext();
try {
if (exception instanceof AuthorizationException) {
externalContext.setResponseStatus(HttpServletResponse.SC_FORBIDDEN);
renderView("/error/access-denied.jsf");
} else if (exception instanceof FileNotFoundException) {
externalContext.setResponseStatus(HttpServletResponse.SC_NOT_FOUND);
renderView("/error/not-found.jsf");
} else {
throw new FacesException(exception);
}
} finally {
queuedEventIterator.remove();
}
}
getWrapped().handle();
}
private void renderView(String viewId) {
FacesContext facesContext = FacesContext.getCurrentInstance();
NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler();
navigationHandler.handleNavigation(facesContext, null, viewId);
facesContext.renderResponse();
}
}